package com.ajocer.springbootinit.rag;

import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.output.Response;
import dev.langchain4j.agent.tool.Tool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ajocer.springbootinit.service.SpotFeeService;
import com.ajocer.springbootinit.service.SpotRouteService;
import com.ajocer.springbootinit.service.SpotService;

import java.util.ArrayList;
import java.util.List;

/**
 * 旅游推荐Agent
 * 支持任务分解和工具调用 */
@Service
@Slf4j
public class TourismAgent {

    @Autowired
    private ChatLanguageModel chatLanguageModel;

    @Autowired
    private PromptTemplateManager promptTemplateManager;

    @Autowired
    private SpotService spotService;

    @Autowired
    private SpotFeeService spotFeeService;

    @Autowired
    private SpotRouteService spotRouteService;
    
    @Autowired
    private MultiLayerCacheService cacheService;

    /**
     * 执行旅游推荐任务
     * @param userQuery 用户查询
     * @return 推荐结果
     */
    public String executeTask(String userQuery) {
        return cacheService.getRecommendationCache("agent:" + userQuery, () -> {
            try {
                log.info("开始执行旅游推荐任务: {}", userQuery);
                
                // 构建系统提示词
                String systemPrompt = "你是一个智能旅游助手，可以帮助用户规划旅游行程、推荐景点和路线。" +
                        "你可以调用工具来获取景点信息、门票价格和路线数据。" +
                        "请根据用户的需求，提供专业、详细的旅游建议。";
                
                // 发送到大模型
                List<ChatMessage> messages = new ArrayList<>();
                messages.add(new SystemMessage(systemPrompt));
                messages.add(new UserMessage(userQuery));
                
                Response<AiMessage> response = chatLanguageModel.generate(messages);
                
                return response.content().text();
            } catch (Exception e) {
                log.error("执行旅游推荐任务失败", e);
                return "抱歉，执行任务时发生错误，请稍后再试。";
            }
        });
    }

    /**
     * 查询景点信息
     * @param keyword 关键词
     * @return 景点信息列表
     */
    @Tool("查询景点信息，根据关键词搜索景点")
    public String querySpots(String keyword) {
        return cacheService.getQueryCache("spots:" + keyword, () -> {
            // 实现景点查询逻辑
            return "查询到的景点信息: " + keyword;
        });
    }
    
    /**
     * 查询门票价格
     * @param spotId 景点ID
     * @return 门票价格信息
     */
    @Tool("查询景点门票价格")
    public String queryFees(Long spotId) {
        return cacheService.getQueryCache("fees:" + spotId, () -> {
            // 实现门票价格查询逻辑
            return "查询到的门票价格信息: " + spotId;
        });
    }
    
    /**
     * 查询旅游路线
     * @param keyword 关键词
     * @return 旅游路线信息
     */
    @Tool("查询旅游路线，根据关键词搜索路线")
    public String queryRoutes(String keyword) {
        return cacheService.getQueryCache("routes:" + keyword, () -> {
            // 实现旅游路线查询逻辑
            return "查询到的旅游路线信息: " + keyword;
        });
    }
} 